Uvod

Glavna zamisao bila je napraviti interaktivnu radionicu u R programskog jeziku da se prikaže spona ekonomije i programiranja kroz Data Science. Ekonomski temelj analize dolazi iz Urbane ekonomije koja se bavi analizom gradova, njihovom strukturom i performansama.

Ideja je bila analizirati ponudu nekretnina u Hrvatskoj. Podatke smo skinuli s https://besplatnioglasi.eu/nekretnine/. Fokus analize je bio na stanovima zbog vremenskog ograničenja analize, problematike heterogenosti kuća i zato što smo do ideje došli spontano, a trebalo je sve izrealizirati u četiri tjedna. Analizirali smo prosječnu cijenu kvadrata stana na području Hrvatske i Grada Zagreba, te prosječno odstupanje cijene. Zatim smo postavili hipotezu da li stan ima “početnu cijenu” kao nekretnina, te da li sadržaji poput parkinga, terase ili ako je stan blizu mora utječu na prosječnu cijenu kvadrata. Također smo napravili svojevrsnu procjenu “indexa cijena kvadrata” stana jer smo također izvukli datum oglasa stana.

Skrepanje i uređivanje podataka

U sljedećem dijelu nalazi se proces data scraping-a i priprema podataka za daljne analize. U odsječcima koda je prikazan ulazak i html kod stranice i prikupljanje željenih podataka. Zanimali su nas podatci poput naslova, cijene, kvadrature, broj soba, lokacije, datum oglašavanja i opis oglasa. Svakom stanu smo izračunali cijenu kvadrata i pridružili mu njegovu županiju. Kreirali smo csv tablicu s gore navedenim podatcima koju kasnije koristimo kao kostur za naše istraživanje.

library(rvest)
library(dplyr)
library(rgdal)
library(ggplot2)
library(sf)
library(stringr) 
library(lubridate)
library(readr)
library(tm)
library(wordcloud)
library(cowplot)
library(stargazer)
library(knitr)
library(kableExtra)
##KO GOD BUDE STAVLJA SKREP ODE, NEZABORAVI OVAJ POCETNI FOLDER ISTO
folder = "/Users/Perica/Desktop/Karte"
#---------------------------------------------------------------SCRAPING DATA----------------------------------

# skidam podatke dok ima oglasa
i =0
while(TRUE){
  i=i+1 #broj stranice
  #kreiram link kao kombinaciju pocetka i broja stranice i učitavam ga u R
  link1 = "https://besplatnioglasi.eu/nekretnine/stanovi?lang=hr&page="
  broj = as.character(i);
  LINK = paste(link1,broj,sep="",collapse=NULL)
  page = read_html(LINK)
  
  #---------------------------------------------------------------VADIM INFO SA STRANICE---------------------
  # vektori s naslovom i cjenom
  naslov = page %>% html_nodes(".titleLink") %>% html_text()
  if(length(naslov)==0) break;    # terministički uvjet
  cijena =  page %>% html_nodes(".actualValue") %>% html_text()
  
  #vađenje 4 puta većeg vektora koji sadrži: kvadraturu,objekt,sobe,lokaciju
  informacije = page %>% html_nodes(".dataHalfValue") %>% html_text()
  
  #sad moram srediti informacije jer točno svaki 4. daje istu informaciju
  kvadratura = subset(informacije,c(1:length(informacije))%%4 == 1)
  objekt = subset(informacije,c(1:length(informacije))%%4 == 2)
  sobe = subset(informacije,c(1:length(informacije))%%4 == 3)
  lokacija = subset(informacije,c(1:length(informacije))%%4 == 0)
  
  #---------------------------------------------------------------ULAZIM U SVAKI OGLAS I VADIM OPIS I DATUM---------------------  
  #1. preuzimam dio gdje su linkovi i spremam kao stringovi, 2. mičem prvih 10 slova,
  #3. uzimam sve do razmaka, 4. skidam zadnje slovo
  linkovi = page %>% html_nodes(".titleLink") %>% as.character()
  linkovi=substring(linkovi, first=10, last = 1000000L)
  linkovi=sub("\\ .*", "", linkovi)
  linkovi=gsub('.{1}$', '', linkovi)
  
  #definiram polje gdje ću spremati datume i opis
  datumi=c()
  opis=c()
  
  #for petlja koja za svaki link uđe u stranicu oglasa
  #nađe klasu koju tražim i da string koji sredim u datum (ili opis)
  for(j in 1:length(linkovi))
  {
    pagezadatum=read_html(linkovi[j]) #učita string
    datum = pagezadatum %>% html_nodes(".detailedTitleHolder") %>% html_text() #nađe element i da text
    datum=sub("\\Šifra oglasa:.*", "", datum) #da sve do šifre oglasa
    datum=gsub('.{3}$', '', datum) # izbriši zadnja 3 elementa
    datum = substr(datum, nchar(datum)-9, nchar(datum)) #da zadnjih 9 elemenata
    datumi = append(datumi,datum) #doda moj datum u listu datuma
    
    
    opis1 = pagezadatum %>% html_nodes(".detailDataDescription") %>% html_text() #skupljm opis
    opis = append(opis,opis1) #dodajem opis vektoru
  }
  
  #---------------------------------------------------------------SREĐIVANJE VARIJABLI---------------------  
  #prebacivanje datuma iz stringa u date(mjesec i godina)
  datumi = strptime(datumi, format = "%d.%m.%Y")
  datumi = as.Date(datumi) #datumi <- as.yearmon(datumi)
  
  #uređivanje cijene (micanje eura..)
  cijena = sub(".*~ ", "", cijena) 
  cijena = sub(" .*", "", cijena)
  cijena = gsub("[[:punct:]]", "", cijena) #micanje točke iz cijene(272.345 -> 272345) zbog racunanja
  cijena = as.numeric(cijena) #prebacivanje stringa u broj
  
  
  #micanje m2 i prebacivanje stringa u broj
  kvadratura = gsub('.{3}$', '', kvadratura)
  kvadratura = as.numeric(kvadratura)
  
  #definiranje cijene po kvadratu
  kvadrat = cijena/kvadratura
  kvadrat = round(kvadrat, 2)
  
  #---------------------------------------------------------------KRAJ GLAVNOG FOR-A I SPJANJE PODATAKA---------------------  
  
  #ako vadim s prve stranice onda kreiram data.frame, a ako sa stranica iza onda ono što izvadim spajam s prijašnjim data.frame
  if(i==1){podaci = data.frame(naslov,cijena,kvadratura ,objekt,sobe,lokacija,opis, kvadrat,datumi,stringsAsFactors = FALSE)}
  else {podaci2 = data.frame(naslov,cijena,kvadratura ,objekt,sobe,lokacija,opis, kvadrat,datumi, stringsAsFactors = FALSE); podaci=rbind(podaci,podaci2);}
}

#---------------------------------------------POPRAVAK NAZIVA I GRUPIRANJE PO ŽUPANIJAMA---------------------------------------

# popravak oštećenih lokacija
old_values <- c("Mali Lošinj", "Kršan", "Varaždin", "Sukošan", "Trešnjevka - Sjever", 
                "PeÅ¡Ä\u0087enica - Žitnjak", "Gornji Grad - MedveÅ¡Ä\u008dak", "ViÅ¡kovo", 
                "Ä\u008crnomerec", "ReÅ¡etari", "Fažana", "PoreÄ\u008d", "Župa DubrovaÄ\u008dka",
                "ZapreÅ¡iÄ\u0087", "TreÅ¡njevka - Jug", "BaÅ¡ka", "OmiÅ¡alj", "Ližnjan", 
                "Malinska-DubaÅ¡nica", "Podsused - VrapÄ\u008de", "Veliko TrgoviÅ¡Ä\u0087e", "Ä\u008cavle", 
                "Å\u00A0ibenik", "ViÅ¡njan", "PaÅ¡man", "Ä\u008cazma", "KaÅ¡tela", "Vinodolska OpÄ\u0087ina", 
                "Fužine", "TuÄ\u008depi", "OrebiÄ\u0087", "MarÄ\u008dana", "KaÅ¡telir-Labinci")

new_values <- c("Mali Lošinj", "Kršan", "Varaždin", "Sukošan", "Trešnjevka - Sjever", 
                "Pešćenica - Žitnjak", "Gornji Grad - Medveščak", "Viškovo", 
                "Črnomerec", "Rešetari", "Fažana", "Poreč", "Župa Dubrovačka", 
                "Zaprešić", "Trešnjevka - Jug", "Baška", "Omišalj", "Ližnjan", 
                "Malinska-Dubašnica", "Podsused - Vrapče", "Veliko Trgovišće", "Čavle", 
                "Šibenik", "Višnjan", "Pašman", "Čazma", "Kaštela", "Vinodolska Općina", 
                "Fužine", "Tučepi", "Orebić", "Marčana", "Kaštelir-Labinci")

replacer <- setNames(new_values, old_values)
podaci$lokacija <- str_replace_all(podaci$lokacija, replacer)



# svakom gradu pridružiti njegovu županiju
lookup_table <- data.frame(grad = c(
      "Čačinci", "Čađavica", "Crnac", "Gradina", "Lukač", "Mikleuš", "Nova Bukovica", "Orahovica", "Pitomača", "Slatina", "Sopje", "Špišić Bukovica", "Suhopolje", "Virovitica", "Virovitica - Okolica", "Voćin", "Zdenci", 
      "Drnje", "Ferdinandovac", "Gola", "Gornja Rijeka", "Hlebine", "Kalinovac", "Kalnik", "Kloštar Podravski", "Koprivnica", "Koprivnica - Okolica", "Koprivnički Bregi", "Koprivnički Ivanec", "Križevci", "Legrad", "Molve", "Novigrad Podravski", "Novo Virje", "Peteranec", "Podravske Sesvete", "Rasinja", "Sokolovac", "Sveti Ivan Žabno", "Sveti Petar Orehovec", "Virje", "Đelekovac", "Đurđevac", 
      "Antunovac", "Beli Manastir", "Belišće", "Bilje", "Bizovac", "Čeminac", "Čepin", "Darda", "Donja Motičina", "Donji Miholjac", "Draž", "Drenje", "Erdut", "Ernestinovo", "Feričanci", "Gorjani", "Jagodnjak", "Kneževi Vinogradi", "Koška", "Levanjska Varoš", "Magadenovac", "Marijanci", "Našice", "Osijek", "Osijek - Okolica", "Petlovac", "Petrijevci", "Podgorač", "Podravska Moslavina", "Popovac", "Punitovci", "Satnica Đakovačka", "Semeljci", "Šodolovci", "Strizivojna", "Trnava", "Valpovo", "Viljevo", "Viškovci", "Vladislavci", "Vuka", "Đakovo", "Đurđenovac",
      "Bale", "Barban", "Brtonigla", "Buje", "Buzet", "Cerovlje", "Fažana", "Gračišće", "Grožnjan", "Kanfanar", "Karojba", "Kaštelir-Labinci", "Kršan", "Labin", "Lanišće", "Ližnjan", "Lupoglav", "Marčana", "Medulin", "Motovun", "Novigrad", "Oprtalj", "Pazin", "Pazin - Okolica", "Pićan", "Poreč", "Pula", "Raša", "Rovinj", "Sveta Nedelja", "Sveti Lovreč", "Sveti Petar U Šumi", "Svetvinčenat", "Tar-Vabriga", "Tinjan", "Umag", "Višnjan", "Vižinada", "Vodnjan", "Vrsar", "Žminj", 
      "Blato", "Dubrovačko Primorje", "Dubrovnik", "Dubrovnik - Okolica", "Janjina", "Konavle", "Korčula", "Kula Norinska", "Lastovo", "Lumbarda", "Metković", "Mljet", "Opuzen", "Orebić", "Ploče", "Pojezerje", "Slivno", "Smokvica", "Ston", "Trpanj", "Vela Luka", "Zažablje", "Župa Dubrovačka", 
      "Donji Kukuruzari", "Dvor", "Glina", "Gvozd", "Hrvatska Dubica", "Hrvatska Kostajnica", "Jasenovac", "Kutina", "Lekenik", "Lipovljani", "Majur", "Martinska Ves", "Novska", "Petrinja", "Popovača", "Sisak", "Sisak - Okolica", "Sunja", "Topusko", "Velika Ludina", 
      "Bebrina", "Brodski Stupnik", "Bukovlje", "Cernik", "Davor", "Donji Andrijevci", "Dragalić", "Garčin", "Gornja Vrba", "Gornji Bogićevci", "Gundinci", "Klakar", "Nova Gradiška", "Nova Kapela", "Okučani", "Oprisavci", "Oriovac", "Podcrkavlje", "Rešetari", "Sibinj", "Sikirevci", "Slavonski Brod", "Slavonski Brod - Okolica", "Slavonski Šamac", "Stara Gradiš¡ka", "Staro Petrovo Selo", "Velika Kopanica", "Vrbje", "Vrpolje", 
      "Barilović", "Bosiljevo", "Cetingrad", "Draganić", "Duga Resa", "Generalski Stol", "Josipdol", "Karlovac", "Karlovac - Okolica", "Krnjak", "Lasinja", "Netretić", "Ogulin", "Ozalj", "Plaški", "Rakovica", "Ribnik", "Saborsko", "Slunj", "Tounj", "Vojnić", "Žakanje", 
      "Benkovac", "Bibinje", "Biograd Na Moru", "Galovac", "Gračac", "Jasenice", "Kali", "Kukljica", "Lišane Ostrovičke", "Nin", "Obrovac", "Pag", "Pakoštane", "Pašman", "Polača", "Poličnik", "Posedarje", "Povljana", "Ugljan", "Ražanac", "Sali", "Škabrnja", "Stankovci", "Starigrad", "Sukošan", "Sveti Filip i Jakov", "Tkon", "Vir", "Zadar", "Zadar - Okolica", "Zemunik Donji", "Vrsi", "Privlaka (ZD)", "Novigrad (ZD)", 
      "Andrijaševci", "Babina Greda", "Bogdanovci", "Borovo", "Bošnjaci", "Cerna", "Drenovci", "Gradište", "Gunja", "Ilok", "Ivankovo", "Jarmina", "Lovas", "Markušica", "Negoslavci", "Nijemci", "Nuštar", "Privlaka", "Stari Jankovci", "Stari Mikanovci", "Tompojevci", "Tordinci", "Tovarnik", "Trpinja", "Vinkovci", "Vinkovci - Okolica", "Voćinci", "Vrbanja", "Vukovar", "Vukovar - Okolica", "Županja", "Otok (VU)", 
      "Baška Voda", "Bol", "Brela", "Cista Provo", "Dicmo", "Dugi Rat", "Dugopolje", "Gradac", "Hrvace", "Hvar", "Imotski", "Jelsa", "Kaštela", "Klis", "Komiža", "Lećevica", "Lokvičići", "Lovreč", "Makarska", "Marina", "Milna", "Muć", "Nerežišća", "Okrug", "Omiš", "Otok", "Podbablje", "Podgora", "Podstrana", "Postira", "Prgomet", "Primorski Dolac", "Proložac", "Pučišća", "Runovići", "Seget", "Selca", "Šestanovac", "Sinj", "Solin", "Solin - Okolica", "Šolta", "Split", "Split - Okolica", "Stari Grad", "Sućuraj", "Supetar", "Sutivan", "Trilj", "Trogir", "Trogir - Okolica", "Tučepi", "Vis", "Vrgorac", "Vrlika", "Zadvarje", "Zagvozd", "Zmijavci", 
      "Bednja", "Beretinec", "Breznica", "Breznički Hum", "Cestica", "Donja Voća", "Donji Martijanec", "Gornji Kneginec", "Ivanec", "Jalžabet", "Klenovnik", "Lepoglava", "Ljubešćica", "Ludbreg", "Mali Bukovec", "Maruševec", "Novi Marof", "Petrijanec", "Sračinec", "Sveti Ilija", "Sveti Đurđ", "Trnovec Bartolovečki", "Varaždin", "Varaždin - Okolica", "Varaždinske Toplice", "Veliki Bukovec", "Vidovec", "Vinica", "Visoko", 
      "Bedekovčina", "Budinščina", "Desinić", "Donja Stubica", "Gornja Stubica", "Hrašćina", "Hum Na Sutli", "Jesenje", "Klanjec", "Konjščina", "Kraljevec Na Sutli", "Krapina", "Krapina - Okolica", "Krapinske Toplice", "Kumrovec", "Lobor", "Mače", "Marija Bistrica", "Mihovljan", "Novi Golubovec", "Oroslavje", "Petrovsko", "Pregrada", "Radoboj", "Stubičke Toplice", "Sveti Križ Začretje", "Tuhelj", "Veliko Trgovišće", "Zabok", "Zagorska Sela", "Zlatar", "Zlatar-Bistrica", "Đurmanec", 
      "Bedenica", "Bistra", "Brckovljani", "Brdovec", "Dubrava", "Dubravica", "Dugo Selo", "Dugo Selo - Okolica", "Farkaševac", "Gradec", "Ivanić-Grad", "Ivanić-Grad - Okolica", "Jakovlje", "Jastrebarsko", "Jastrebarsko - Okolica", "Klinča Sela", "Kloštar Ivanić", "Krašić", "Kravarsko", "Križ", "Luka", "Marija Gorica", "Orle", "Pisarovina", "Pokupsko", "Preseka", "Pušća", "Rakovec", "Rugvica", "Samobor", "Samobor - Okolica", "Stupnik", "Sveti Ivan Zelina", "Velika Gorica", "Velika Gorica - Okolica", "Vrbovec", "Zaprešić", "Zaprešić - Okolica", "Žumberak", "Sveta Nedjelja", 
      "Bakar", "Baška", "Brod Moravice", "Čabar", "Čavle", "Cres", "Crikvenica", "Delnice", "Dobrinj", "Fužine", "Jelenje", "Kastav", "Klana", "Kostrena", "Kraljevica", "Krk", "Lokve", "Lovran", "Mali Lošinj", "Malinska-Dubašnica", "Matulji", "Mošćenička Draga", "Mrkopalj", "Novi Vinodolski", "Omišalj", "Opatija", "Opatija - Okolica", "Punat", "Rab", "Ravna Gora", "Rijeka", "Skrad", "Vinodolska Općina", "Viškovo", "Vrbnik", "Vrbovsko", 
      "Biskupija", "Civljane", "Drniš", "Ervenik", "Kijevo", "Kistanje", "Knin", "Murter", "Pirovac", "Primošten", "Promina", "Rogoznica", "Ružić", "Šibenik", "Šibenik - Okolica", "Skradin", "Tisno", "Unešić", "Vodice", 
      "Brinje", "Donji Lapac", "Gospić", "Gospić - Okolica", "Karlobag", "Lovinac", "Novalja", "Otočac", "Perušić", "Plitvička Jezera", "Senj", "Udbina", "Vrhovine", 
      "Berek", "Bjelovar", "Bjelovar - Okolica", "Čazma", "Daruvar", "Dežanovac", "Gareš¡nica", "Grubišno Polje", "Hercegovac", "Ivanska", "Kapela", "Končanica", "Nova Rača", "Rovišće", "Šandrovac", "Severin", "Sirač", "Štefanje", "Velika Pisanica", "Velika Trnovitica", "Veliki Grđevac", "Veliko Trojstvo", "Zrinski Topolovac", "Đulovac", 
      "Brezovica", "Črnomerec", "Donja Dubrava", "Donji Grad", "Gornja Dubrava", "Gornji Grad - Medveščak", "Maksimir", "Novi Zagreb - Istok", "Novi Zagreb - Zapad", "Pešćenica - Žitnjak", "Podsljeme", "Podsused - Vrapče", "Sesvete", "Stenjevec", "Trešnjevka - Jug", "Trešnjevka - Sjever", "Trnje", "Zagreb - Okolica", 
      "Belica", "Čakovec", "Čakovec - Okolica", "Dekanovec", "Domašinec", "Donji Kraljevec", "Donji Vidovec", "Goričan", "Gornji Mihaljevec", "Kotoriba", "Mala Subotica", "Mursko Središće", "Nedelišće", "Orehovica", "Podturen", "Prelog", "Pribislavec", "Selnica", "Šenkovec", "Strahoninec", "Štrigova", "Sveta Marija", "Sveti Juraj Na Bregu", "Sveti Martin Na Muri", "Vratišinec", 
      "Brestovac", "Čaglin", "Jakšić", "Kaptol", "Kutjevo", "Lipik", "Pakrac", "Pleternica", "Požega", "Požega - Okolica", "Velika"
    ),
    županija = c(
      rep("Virovitičko-podravska", 17),
      rep("Koprivničko-križevačka", 26),
      rep("Osječko-baranjska", 43),
      rep("Istarska", 41),
      rep("Dubrovačko-neretvanska", 23),
      rep("Sisačko-moslovačka", 20),
      rep("Brodsko-posavska", 29),
      rep("Karlovačka", 22),
      rep("Zadarska", 34),
      rep("Vukovarsko-srijemska", 32),
      rep("Splitsko-dalmatinska", 58),
      rep("Varaždinska", 29),
      rep("Krapinsko-zagorska", 33),
      rep("Zagrebačka", 40),
      rep("Primorsko-goranska", 36),
      rep("Šibensko-kninska", 19),
      rep("Ličko-senjska", 13),
      rep("Bjelovarsko-bilogorska", 24),
      rep("Grad Zagreb", 18),
      rep("Međimurska", 25),
      rep("Požeško-slavonska", 11)
    ))


# dodamo stupac sa županijama
podaci <- merge(podaci, lookup_table, by.x = "lokacija", by.y = "grad")

#---------------------------------------------------------------ČIŠĆENJE + BRISANJE VARIJABLI---------------------

#učitavanje i sređivanje podataka  
podaci = subset(podaci,podaci$kvadratura>15) #mičem nekretnine manje od 15 kvadrata
podaci = subset(podaci,podaci$kvadrat<13000) #mičem skuplje od 13k€ 
podaci = subset(podaci,podaci$kvadratura<1000) #mičem veće od 1000 kvadrata
podaci = subset(podaci, kvadrat > 500) #mičem jeftinije od 500€ po kvadratu

#brišemo koji nam više ne trebaju
rm(broj); rm(cijena); rm(datum); rm(datumi); rm(i); rm(informacije); rm(j); rm(kvadrat); rm(kvadratura); rm(LINK); rm(link1); rm(linkovi); rm(lokacija);
rm(naslov); rm(new_values); rm(objekt); rm(old_values); rm(opis); rm(opis1); rm(replacer); rm(sobe); rm(lookup_table); rm(page); rm(pagezadatum); rm(podaci2);
#prikaz tablice koju smo dobili skrepanjem
kable(podaci[c(1,2,4,5),],align = 'l',format = "html") %>% 
  kable_styling(full_width = FALSE, latex_options = c('hold_position', 'striped'),
  position = "center", font_size = 12)
lokacija naslov cijena kvadratura objekt sobe opis kvadrat datumi županija
1 Bakar Stan Bakar 1S+DB - 66m2, stan s terasom i potkrovljem 100000 66.00 U stambenoj zgradi 1s-1s+DB Prodaje se stan u Bakru površine 66 m2.Stan se nalazi na prvom katu, sastoji se od kuhinje, kupaonice, dnevnog boravka, spavaće sobe,terase i potkrovlja.Terasa je zbog svoje prostranosti i orijentacije (izolirana od pogleda s ulice a otvorena pogledom prema zelenim površinama), dobra strana ovog stana. Stan zahtijeva renovaciju. Velika prednost ove nekretnine je mnoštvo mogućnosti prenamjene postojećeg rasporeda i proširenje na pripadajuće potkrovlje čime bi se dobila veća kvadratura stambene površine.Stan s mnogo potencijala.Poštovani klijenti, agencijska provizija naplaćuje se u skladu s Općim uvjetima poslovanjawww.dux-nekretnine.hr/opci-uvjeti-poslovanjaID KOD AGENCIJE: 963Tomislav TomišaAgent s licencomMob: +385 95 199 2696Tel: +385 51 518 174E-mail: [email protected]www.dux-nekretnine.hr 1515.15 2022-11-14 Primorsko-goranska
2 Bakar Hreljin - stan na 1. katu, 58 m2 130000 58.00 U stambenoj zgradi 2s-2s+DB Hreljin - A4 Dvosoban stan na 1. katu (2s+db) 58m2. Lođa kao nastavak dnevnog boravka.Stanovi se prodaju u fazi dovršenosti “KLJUČ U RUKE”. To podrazumijeva završen okoliš te sve zajedničke dijelove zgrade.Stanovi imaju predviđeno KLIMU, PODNO GRIJANJE, te imaju dimnjak.Pvc stolarija sa roletama, PROTUPROVALNA ulazna vrata u stanove, TALIJANSKA SOBNA VRATA, KERAMIKA+LAMINAT ZA PODNO GRIJANJE, WALK IN TUŠ, TE 1.KLASA SANITARIJE.Fasada je stiropor, 10cm Baumit sustav.Svakom stanu je osigurano jedno parkirno mjesto.Završetak radova je proljeće 2023.Hreljin je malo mjesto smješteno na 307m nadmorske visine. u njemu postoji pošta, škola, vrtić, trgovina, ljekarna, kao i razne uslužne djelatnosti. Sa svojom izvrsnom prometnom povezanošću, Hreljin je postao traženo mjesto za život. Zbog spoja na brzu cestu, Crikvenička rivijera, i otok Krk su nadohvat ruke, a udaljen je samo 10-ak minuta vožnje do centra Rijeke. Grad Bakar je na tri minute vožnje, kao i industrijska zona Kukuljanovo. Ovaj projekt je zamišljen kao prilika za one koji žele uživati u čarima življenja izvan gradske gužve, dalje od stresa, gradske užurbanosti, a opet blizu svim uslugama, koje su nam potrebne u svakodnevnom životu.Također je odlična lokacija za investiciju u nekretninu, a u svrhu iznajmljivanja; zbog svoje prometne povezanosti i same blizine industrijske zone Kukuljanovo, stalna je potreba za smještajem radnika, kao obitelji i samaca. To jamči brzinu povrata uloženog novca u kupnju stana kroz iznajmljivanje.Za sve ostale informacije, cijene, dinamiku plaćanja, kao i za sva dodatna pitanja, obratite nam se s povjerenjem.****ID KOD AGENCIJE: 570-9949Koraljka BarbirAgent godineMob: +385 92 16 80 142Tel: +385 51 33 20 07E-mail: [email protected]www.opatijanekretnine.hrCijenjeni potencijalni najmoprimci, zakupoprimci i kupci: Razgled nekretnine moguć je isključivo uz potpis Ugovora o posredovanju, u svrhu zaštite vlasnika nekretnine od posjeta neregistriranih osoba, a u skladu sa Zakonom o zaštiti podataka i Zakonom o posredovanju u prometu nekretnina. Agencijska provizija za najmoprimca/zakupnika iznosi jednu mjesečnu najamninu/zakupninu + PDV. Agencijska provizija za kupca iznosi 3%+PDV-e od ukupno dogovorene kupoprodajne cijene. U slučaju da ste za navedenu nekretninu negdje naišli na nižu cijenu, ista vrijedi i kod nas. Pri svakom razgledavanju nekretnine potencijalni kupac/najmoprimatelj je obavezan ispuniti Ugovor o posredovanju u kojem su navedeni: - osnovni podaci o nekretnini - osnovni podaci o potencijalnom kupcu/najmoprimatelju - osnovni podaci o agenciji - iznos agencijske provizije 2241.38 2022-11-14 Primorsko-goranska
4 Bakar Bakar, 90m2, 4-sobni stan s db na samoj rivi 156000 90.00 U stambenoj zgradi 3s-3s+DB U centru Bakra na samoj rivi smještena je ova nekretnina od 90m2 s pogledom na more. Sastoji se od kuhinje s blagovaonicom, dnevnog boravka, tri veće i jedne manje sobe, hodnika, kupaonice te pripadajućeg tavanskog prostora od 75m2 s mogućnošću uređenja u dodatnu manju stambenu jedinicu i dodatnog pomoćnog toaleta. ID KOD AGENCIJE: 23840Željko KalinčevićDirektorMob: +385 91 205 0962Tel: 051 322 376Fax: 051 311 059E-mail: [email protected]http://millennium-nekretnine.hr 1733.33 2022-11-14 Primorsko-goranska
5 Bakar Hreljin, novogradnja, 2s+db 122000 59.93 U stambenoj zgradi 2s-2s+DB U ponudi je novogradnja koja je prilika za one koji žele uživati u čarima življenja izvan gradske gužve, daleko od stresa i gradske užurbanosti, a opet u blizini svih sadržaja i usluga koji su neophodni u svakodnevnom životu.Sastoji se od dvije zgrade s ukupno 8 stanova. Stanovi se prodaju kompletno uređeni, tzv. princip “ključ u ruke”, a predviđeni završetak radova je krajem 2022. godine. Stanovima u prizemlju (1s+db, 2s+db) pripada dio vrta ispred stana koji će svojim korisnicima pružiti sve blagodati življenja u stanu s vrtom, odnosno terasom ispred stana.Na prvom katu stanovi (1s+db i 2s+db) imaju lijep balkon ili loggiu kao nastavak dnevnog boravka.Stanovi imaju predviđeno podno grijanje te klima uređaje.Fasada je stiropor debljine 10 cm Baumit sustav, stolarija je PVC s roletama.Svaki stan ima osigurano jedno parkirno mjesto.Dobra uređenost Hreljina u smislu prisutnosti raznih sadržaja ( škola, vrtić, trgovina, ljekarna…) i izvrsna prometna povezanost s Rijekom, Crikveničkom rivijerom i otokom Krk, čine ga traženim mjestom za život.ID KOD AGENCIJE: 32518Millennium nekretnine exclusive d.o.o.Mob: +385 91 322 3760Tel: +385 51 322 376Fax: 051 311 059E-mail: [email protected]http://millennium-nekretnine.hr 2035.71 2022-09-21 Primorsko-goranska
# sve županije
žup_cro <- data.frame(
  županija = c(
    "Virovitičko-podravska",
    "Koprivničko-križevačka",
    "Osječko-baranjska",
    "Istarska",
    "Dubrovačko-neretvanska",
    "Sisačko-moslovačka",
    "Brodsko-posavska",
    "Karlovačka",
    "Zadarska",
    "Vukovarsko-srijemska",
    "Splitsko-dalmatinska",
    "Varaždinska",
    "Krapinsko-zagorska",
    "Zagrebačka",
    "Primorsko-goranska",
    "Šibensko-kninska",
    "Ličko-senjska",
    "Bjelovarsko-bilogorska",
    "Grad Zagreb",
    "Međimurska",
    "Požeško-slavonska"
  )
)

# prosječni kvadrat po županiji
avg_cro <- aggregate(kvadrat ~ županija, data = podaci, FUN = mean)

# standardna devijacija
sd_cro <- aggregate(kvadrat ~ županija, data = podaci, FUN = sd)

# koeficijent varijacije po županiji
cv_cro <-
  data.frame(županija = avg_cro$županija,
             cv = sd_cro$kvadrat / avg_cro$kvadrat)

# broj oglasa po županiji
cnt_cro <-
  aggregate(lokacija ~ županija, data = podaci, FUN = length)

# spajanje gore navedenih podataka
cro_data <-
  merge(merge(avg_cro, cv_cro, by = "županija"), cnt_cro, by = "županija")
cro_data <-
  merge(žup_cro, cro_data, by = "županija", all.x = TRUE)
names(cro_data) <-
  c("županija", "avgKvadrata", "koefVarKvadrata", "brojOglasa")
kable(cro_data) %>% 
  kable_styling(full_width = FALSE, latex_options = c('hold_position', 'striped'),
  position = "center", font_size = 12)
županija avgKvadrata koefVarKvadrata brojOglasa
Bjelovarsko-bilogorska 1106.945 0.1647883 4
Brodsko-posavska 1501.212 0.3526608 40
Dubrovačko-neretvanska 3484.280 0.3857475 49
Grad Zagreb 2799.509 0.2730213 1566
Istarska 3211.686 0.3448460 2097
Karlovačka 1486.813 0.3862668 3
Koprivničko-križevačka NA NA NA
Krapinsko-zagorska 1666.701 0.2275210 8
Ličko-senjska 2951.229 0.3264797 60
Međimurska 1593.333 0.1050826 3
Osječko-baranjska 1559.107 0.3000016 11
Požeško-slavonska 2923.640 NA 1
Primorsko-goranska 2826.790 0.4699109 4583
Šibensko-kninska 2968.267 0.2733339 427
Sisačko-moslovačka 2582.590 0.0160993 2
Splitsko-dalmatinska 3156.766 0.3161149 250
Varaždinska 1948.274 0.2116252 18
Virovitičko-podravska NA NA NA
Vukovarsko-srijemska 2899.750 NA 1
Zadarska 3235.038 0.3521890 551
Zagrebačka 2220.450 0.2394800 109

Vizualizacija podataka

Vizualizacija podataka je snažan alat koji nam omogućuje da složene informacije predstavimo na jasan i razumljiv način. Uz pomoć vizualnih prikaza, možemo lako identificirati obrasce i anomalije koje bi bile teže primijetiti u tabličnim prikazima. Ovakva vrsta prikaza je često lakša za razumijevanje široj publici, jer nije potrebno specifično akademsko znanje da bi se mogla interpretirati.

# županije sortirane silazno po broju oglasa
cro_data_sorted <- cro_data[order(-cro_data$brojOglasa),]

# top x županija po broju oglasa
x <- 5
top_x_zupanija <- data.frame(županija = cro_data_sorted$županija[1:x], 
                             brojOglasa = cro_data_sorted$brojOglasa[1:x])

# ostale županije i zbroj njihovih oglasa
ostali_brojOglasa <- sum(cro_data_sorted$brojOglasa[x:length(cro_data_sorted$brojOglasa)], na.rm = TRUE)
ostali_zupanija <- data.frame(županija = "Ostali", brojOglasa = ostali_brojOglasa)

# spajanje u jednu tablicu
top_x_ostali <- rbind(top_x_zupanija, ostali_zupanija)

Kružni dijagram

# brojevi oglasa -> postotak
piepercent <- round(100*top_x_ostali$brojOglasa/sum(top_x_ostali$brojOglasa), 1)
piepercent[length(piepercent)] <- round(100 - sum(piepercent[-length(piepercent)]), 1)
# kružni dijagram
pie(piepercent,
    labels = paste(top_x_ostali$županija, paste0(piepercent, "%")),
    main = "Kružni dijagram", 
    col = rainbow(length(top_x_ostali$brojOglasa)))

Vionlinski dijagram

Violinski dijagram je vizualni prikaz raspodjele podataka koji omogućuje brzo i jednostavno razumijevanje njihove distribucije. Osnovna komponenta dijagrama je “violinski” oblik, gdje širina predstavlja gustoću podataka na y-osi. Linija koja se proteže okomito prikazuje raspon najmanje i najveće vrijednosti, dok se outlieri prikazuju točkama izvan “violinskih” oblika. Kutija unutar violinskih oblika označava interkvartilni raspon (IQR), a crta unutar kutije označava medijan.

# sve županije
all_zupanije <- unique(cro_data_sorted$županija)

# županije koje nisu u top_x_zupanija i zamijeni ih s 'Ostali'
ostale_zupanije <- setdiff(all_zupanije, top_x_zupanija$županija)
podaci_renamed <-
  within(podaci, županija[županija %in% ostale_zupanije] <-
           'Ostali')

# željeni poredak
podaci_renamed$županija <-
  factor(podaci_renamed$županija, levels = top_x_ostali$županija)

# violinski dijagram
ggplot(data = podaci_renamed, aes(x = županija, y = kvadrat, color = županija)) +
  geom_violin() +
  labs(title = "Violinski dijagram",
       x = "Županija",
       y = "Kvadratura") +
  geom_boxplot(width = 0.1) +
  guides(color = "none")

Podatkovne karte (Hrvatska)

# karta
cro_map <-
  readOGR(folder, "Croatia_map")

# spajanje prijašnjih podataka s kartom
cro_data_map <-
  merge(
    cro_map,
    cro_data,
    by.x = "County",
    by.y = "županija",
    all.x = TRUE
  )
# pogodniji format
cro_data_map <- st_as_sf(cro_data_map)  
# prosječna cijena po kvadratu (Hrvatska)
ggplot(cro_data_map) +
  geom_sf(aes(fill = round(avgKvadrata, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#efedf5",
    high = "#3f007d",
    # raspon boja županija
    # opcionalno za boju onih bez podataka ide: na.value = "boja"
    breaks = c(1000, 1650, 2250, 2850, 3500),
    limits = c(1000, 3500)
  ) +
  theme_void() +       # makne rešetke preko karte
  labs(title = "Prosječna cijena po kvadratu u Hrvatskoj",
       fill = "Cijena po metru kvadratnom (€)",
       caption = "Zelene županije - značajna količina podataka\n
       Crne županije - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(avgKvadrata) |
        is.null(avgKvadrata),
      County,  # ako nema podataka, onda samo ime županije
      paste0(County, "\n", "€", sprintf("%.2f", round(avgKvadrata, 2)))
    )),
    size = 2.5,
    fontface = "bold",
    color = ifelse(
      cro_data_map$brojOglasa < 40 |
        is.na(cro_data_map$brojOglasa) |
        is.null(cro_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),  # zeleni imaju značajno podataka, crni ne
    fill = "#F2F3F4",
    label.padding = unit(0.065, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0,
    alpha = 0.5,
    fill.alpha = 0.5, color.alpha = 1
  ) +
  theme(plot.title = element_text(size = 30, face = "bold"),
        plot.caption = element_text(size = 14))

# koeficijent varijacije kvadrature (Hrvatska)
ggplot(cro_data_map) +
  geom_sf(aes(fill = round(koefVarKvadrata * 100, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#deebf7",
    high = "#08306b",
    breaks = c(0, 10, 20, 30, 40, 50),
    limits = c(0, 50)
  ) +
  theme_void() +
  labs(title = "Koeficijent varijacije cijene kvadrata u Hrvatskoj",
       fill = "Koeficijent varijacije (%)",
       caption = "Zelene županije - značajna količina podataka\nCrne županije - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(koefVarKvadrata) |
        is.null(koefVarKvadrata) ,
      County,
      paste0(County, "\n", sprintf("%.2f", round(koefVarKvadrata, 4) * 100), "%")
    )),
    size = 2.5,
    fontface = "bold",
    color = ifelse(
      cro_data_map$brojOglasa < 40 |
        is.na(cro_data_map$brojOglasa) |
        is.null(cro_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),
    fill = "#F2F3F4",
    label.padding = unit(0.065, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0,
    alpha = 0.5,
    fill.alpha = 0.5, color.alpha = 1
  ) +
  theme(plot.title = element_text(size = 30, face = "bold"),
        plot.caption = element_text(size = 14))

Podatkovne karte (Zagreb)

# svi kvartovi
kvart_zg <-
  data.frame(
    lokacija = c(
      "Brezovica",
      "Črnomerec",
      "Donja Dubrava",
      "Donji Grad",
      "Gornja Dubrava",
      "Gornji Grad - Medveščak",
      "Maksimir",
      "Novi Zagreb - Istok",
      "Novi Zagreb - Zapad",
      "Pešćenica - Žitnjak",
      "Podsljeme",
      "Podsused - Vrapče",
      "Sesvete",
      "Stenjevec",
      "Trešnjevka - Jug",
      "Trešnjevka - Sjever",
      "Trnje",
      "Zagreb - Okolica"
    )
  )

# izdvojimo kvartove
zg_data <-
  subset(podaci,
         županija == "Grad Zagreb",
         select = c("lokacija", "kvadrat"))

# prosječni kvadrat po kvartovima
avg_zg <- aggregate(kvadrat ~ lokacija, data = zg_data, FUN = mean)

# standardna devijacija
sd_zg <- aggregate(kvadrat ~ lokacija, data = zg_data, FUN = sd)

# koeficijent varijacije po kvartovima
cv_zg <-
  data.frame(lokacija = avg_zg$lokacija,
             cv = sd_zg$kvadrat / avg_zg$kvadrat)

# broj oglasa po kvartovima
cnt_zg <-
  aggregate(kvadrat ~ lokacija, data = zg_data, FUN = length)

# spajanje gore navedenih podataka
zg_data <-
  merge(merge(avg_zg, cv_zg, by = "lokacija"), cnt_zg, by = "lokacija")
zg_data <-
  merge(kvart_zg, zg_data, by = "lokacija", all.x = TRUE)
names(zg_data) <-
  c("lokacija", "avgKvadrata", "koefVarKvadrata", "brojOglasa")  #stupce preimenovat

# karta
zg_map <-
  readOGR(folder, "Zagreb_map")

# spajanje prijašnjih podataka s kartom
zg_data_map <-
  merge(zg_map,
        zg_data,
        by.x = "District",
        by.y = "lokacija",
        all.x = TRUE)
# pogodniji format
zg_data_map <- st_as_sf(zg_data_map)  
# prosječna cijena po kvadratu (Zagreb)
ggplot(zg_data_map) +
  geom_sf(aes(fill = round(avgKvadrata, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#fcfbfd",
    high = "#3f007d",
    #raspon boja kvartova
    breaks = c(2000, 2500, 3000, 3500),
    limits = c(2000, 3500)
  ) +
  theme_void() +       #tema da nema rešetki priko karte
  labs(title = "Prosječna cijena po kvadratu u Zagrebu",
       fill = "Cijena po metru kvadratnom (€)",
       caption = "Zeleni kvartovi - značajna količina podataka\nCrni kvartovi - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(avgKvadrata) |
        is.null(avgKvadrata),
      District,
      paste0(District, "\n", "€", sprintf("%.2f", round(avgKvadrata, 2)))
    )),
    #ako nema podataka, onda samo ime županije
    size = 2.5,
    #za tekst kvartova je sve dalje
    fontface = "bold",
    color = ifelse(
      zg_data_map$brojOglasa < 80 |
        is.na(zg_data_map$brojOglasa) |
        is.null(zg_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),
    fill = "#F2F3F4",
    label.padding = unit(0.065, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0,
    alpha = 0.5,
    fill.alpha = 0.5, color.alpha = 1
  ) +
  theme(plot.title = element_text(size = 30, face = "bold"),
        plot.caption = element_text(size = 14))

# koeficijent varijacije kvadrature (Zagreb)
ggplot(zg_data_map) +
  geom_sf(aes(fill = round(koefVarKvadrata * 100, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#deebf7",
    high = "#08306b",
    breaks = c(0, 10, 20, 30, 40),
    limits = c(0, 40)
  ) +
  theme_void() +
  labs(title = "Koeficijent varijacije cijene kvadrata u Zagrebu",
       fill = "Koeficijent varijacije (%)",
       caption = "Zeleni kvartovi - značajna količina podataka\n
       Crni kvartovi - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(koefVarKvadrata) |
        is.null(koefVarKvadrata),
      District,
      paste0(District, "\n", sprintf("%.2f", round(koefVarKvadrata, 4) * 100), "%")
    )),
    size = 2.5,
    fontface = "bold",
    color = ifelse(
      zg_data_map$brojOglasa < 80 |
        is.na(zg_data_map$brojOglasa) |
        is.null(zg_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),
    fill = "#F2F3F4",
    label.padding = unit(0.065, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0,
    alpha = 0.5,
    fill.alpha = 0.5, color.alpha = 1
  ) +
  theme(plot.title = element_text(size = 30, face = "bold"),
        plot.caption = element_text(size = 14))

Statistika

LINEARNA REGRESIJA KVADRATURE STANA I NJEGOVE CIJENE

U ovom odjeljku je demonstriran klasičan primjer linearne regresije. Motivacija za linearnu regresiju kao i za mnoge druge ekonomske modele je “zdrava logika” koja se poslije pokušava potkrijepiti rezultatima i statističkim testovima.

Oko linearnosti modela nije bilo nikakvih neslaganja unutar ekipe jer svi imamo taj “osjećaj” da svaki dodatni kvadrat stana jednako poveća cijenu, no što se tiče signifikantnosti slobodnog regresijskog parametra tu smo se našli u neslaganju. Laićki rečeno pitanje je: “ima li stan nekakvu početnu vrijednost na koju se dodaje umnožak broja kvadrata i cijene kvadrata ?”

### graf cijenje i kvadrature svih oglasa (kontrolni graf) ###
p3<-ggplot(podaci, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="deepskyblue3")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  coord_cartesian(ylim = c(20000, 250000),
                  xlim = c(15,120), expand = FALSE) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p3 #prikaz grafa

model <- lm(cijena ~ kvadratura, data = podaci) #definiram regresiju
summary(model) #prikaz koeficjenata
## 
## Call:
## lm(formula = cijena ~ kvadratura, data = podaci)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1119683   -59463   -15186    33362  1713604 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5271.88    3104.00   1.698   0.0895 .  
## kvadratura   2856.30      32.88  86.872   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 131600 on 9781 degrees of freedom
## Multiple R-squared:  0.4355, Adjusted R-squared:  0.4355 
## F-statistic:  7547 on 1 and 9781 DF,  p-value: < 2.2e-16
rm(model,p3) #brisanje varijabli

Sada nakon rezultata vidimo da nam je linearan model jako kvalitetan. To najviše vidimo po R2 koeficijentu koji iznosi 0.43 što govori da je 43% odstupanja zavisne varijable protumačeno modelom. Što povlači da smo našli koeficijent korelacije od 0.65 (srednje jaka pozitivna korelacija), također na ovoliko veliki uzorak testiranje signifikantnosti koeficijenta korelacije će vratiti signifikantan rezultat.

Iz vodećeg koeficijenata pravca zaključujemo da se svakim dodatnim kvadratom cijena stana poveća u prosjeku za 2856 €, dok na pitanje o početnoj vrijednosti stana ne možemo dati neki konkretan odgovor. Naime naša početna vrijednost stana je ispala 5241€ uz to da nam p-vrijednost iznosi 0.0911 što komentiramo kao: “uz razinu značajnosti od 10% (p<0.1) prihvaćamo da postoji početna cijena stana (odnosno koeficijent nam nije 0, no ako nam je tolerancija na grešku manja od 10% kao npr. 5% (0.05<p) ne možemo onda ponoviti isti zaključak i postoji mogućnost da nam je koeficijent neznačajno malen”. (Koristio se dvosmjerni test značajnosti regresorske varijable)

U suštini na naše pitanje o početnoj vrijednosti stana nažalost ne možemo garantirati nikakav siguran odgovor, no odgovor “DA” je vjerojatniji nego odgovor “NE”.

ANALIZA CIJENE KVADRATA KROZ VRIJEME

U ovome dijelu želimo odgovoriti na pitanje: “Kako se kreću cijene kvadrata kroz vrijeme i koliko dobro to možemo modelirati”. Također ćemo sastaviti bazni index cjena za zadnjih godinu dana.

B=1 #B je baza koju uzimamo za bazni index (1=4/2022 dok je 12=3/2023)

#definiram vektore za spremanje
cjene = c()
velicina = c()
mjesec = c()

#za cjene iz 2022
filter=subset(podaci, year(podaci$datumi)==2022)
for(i in 4:12){
  mjesec = append(mjesec,paste(as.numeric(i),"/","2022",sep="",collapse=NULL))
  filter2=subset(filter,month(filter$datumi)==i)
  velicina=append(velicina,length(filter2$kvadrat))
  cjene = append(cjene,mean(filter2$kvadrat))
}
# za cjene iz 2023
filter=subset(podaci, year(podaci$datumi)==2023)
for(i in 1:3){
  mjesec = append(mjesec,paste(as.numeric(i),"/","2023",sep="",collapse=NULL))
  filter2=subset(filter,month(filter$datumi)==i)
  velicina=append(velicina,length(filter2$kvadrat))
  cjene = append(cjene,mean(filter2$kvadrat))
}

#racunam indekse
cjeneB=(cjene/cjene[B])*100

#kreiram tablicu
tablica=data.frame(cjene,cjeneB,velicina,mjesec)
Q=tablica #za tablicu

#samo misece probacijen u tip datuma
tablica$mjesec <- as.Date(paste0("01/", tablica$mjesec), format = "%d/%m/%Y")

# Definiram index kao graf
index <- ggplot(tablica, aes(x=mjesec, y=cjene)) +
  geom_line(size = 1.5, color = "red") + 
  geom_point(color = "black") + 
  geom_smooth(method = "lm", se = TRUE, level=0.99)+
  scale_y_continuous(breaks = seq(2800,3500,100)) +
  scale_x_date(date_breaks = "2 months") +
  ylab("Cijena kvadrata u €") +
  xlab("") + 
  ggtitle("Cijene stanova dataseta po datumu") +
  theme(axis.text = element_text(size = 10),
        axis.title = element_text(size = 15),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 20, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
theme_linedraw()
index #prikaz grfa

Iz grafa prosječnih cijena po mjesecu čitamo da bi linearan model opet mogao zadovoljiti naše potrebe modeliranja (na kratak rok !).

Iako “logički” eksponencijalni model ima više smisla za ovaj slučaj jer: “vrijednost novca opada eksponencijalno (prosječna inflacija je 2-3% godišnje) što utječe da vrijednost stana ( kojemu je stvarna vrijednost fiksna ) mjereći u FIAT valuti raste eksponencijalno”.

Naša opravdanja korištenja linearnog modela su:

1. Svaka funkcija se lokalno može proizvoljno dobro aproksimirati, a eksponencijalne funkcije koje imaju koeficijent manji od 0.02 u eksponent uz x prate jako blizu linearnu funkciju za prvih 10-etak članova. Odnosno ex*0.02 ≈ 1.02x ≈ 1+x*0.02 (uz uvjet x ≤10 )

2. Uz znanje da je porast između prvog i zadnjeg podatka oko 15% odnosno mjesečni porast je oko 1.25% zadovoljavamo uvjete naše prve točke i uz varijabilnost podataka koju smo dobili preciznost nam ne treba biti prioritet jer niti ne možemo napraviti nešto bolje od “grube aproksimacije”

#koef korelacije
paste("Koeficjent koorelacije je:",as.character(cor(cjene,c(1:12))))
## [1] "Koeficjent koorelacije je: 0.81160872719586"
cor.test(cjene,c(1:12))
## 
##  Pearson's product-moment correlation
## 
## data:  cjene and c(1:12)
## t = 4.3932, df = 10, p-value = 0.001349
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4449640 0.9452353
## sample estimates:
##       cor 
## 0.8116087
#moja regresija
model <- lm(cjene ~ c(1:12), data = tablica)
summary(model)
## 
## Call:
## lm(formula = cjene ~ c(1:12), data = tablica)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -173.406  -41.264   -7.016   24.660  206.143 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2728.713     62.109  43.934 8.97e-13 ***
## c(1:12)       37.075      8.439   4.393  0.00135 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 100.9 on 10 degrees of freedom
## Multiple R-squared:  0.6587, Adjusted R-squared:  0.6246 
## F-statistic:  19.3 on 1 and 10 DF,  p-value: 0.001349
Q #prikaz tablice podataka
##       cjene    cjeneB velicina  mjesec
## 1  2882.174 100.00000       28  4/2022
## 2  2811.406  97.54463      102  5/2022
## 3  2842.811  98.63426       81  6/2022
## 4  2860.103  99.23421       63  7/2022
## 5  2954.888 102.52286       49  8/2022
## 6  2920.485 101.32924     1732  9/2022
## 7  2814.828  97.66336      452 10/2022
## 8  2952.276 102.43226     4463 11/2022
## 9  3044.397 105.62850      968 12/2022
## 10 3017.434 104.69298     1266  1/2023
## 11 3155.811 109.49411       90  2/2023
## 12 3379.749 117.26388       17  3/2023
#rjesavanje varijabli
rm(B,cjeneB,cjene,i,mjesec,velicina,filter,filter2,index,model,tablica,Q)

Nakon provlačenja modela kroz naše podatke kao i obično prvo nas zanimaju koeficijent korelacije i R2.Iz koeficijenta korelacije i njegovog pripadnog testa signifikantnosti zaključujemo da postoji snažna pozitivna korelacija između vremena i prosječne cijene kvadrata stana. Nadalje iz korigiranog R2 koji je 0.60 zaključujemo da nam je model “kvalitetan” (interpretacija korigiranog R2 je ista kao i za obični samo što prirodno R2 ima tendenciju biti veći kako nam je uzorak manji pa bi ga se trebalo korigirati).

Nakon što smo stekli povjerenje u naš model krećemo s komentiranjem modela i dobivenih rezultata. Iz vodećeg koeficijenta pravca saznajemo da se u prosjeku mjesečno cijene kvadrata povećavaju za 36€.

U četvrtom mjesecu 2023. očekujemo prosječnu cijenu da će se nalaziti negdje oko 2743+13*36=3211€ sa standardnom devijacijom od 101€.

RIJEČI

U ovom dijelu analize bavimo se analizom opisa u oglasima tj. specifično testiranje korelacije između broja riječi u opisu i cijene stanova te promatranje utječu li određene riječi u opisu na cijenu stanova.

Analiza broja riječi

Prvo krećemo s analizom broja riječi u oglasu. Promatranjem opisa došli smo na ideju da postoji pozitivna korelacija između broja riječi u opisu i cijene po m2. Imamo dvije glavne motivacije za takvo razmišljanje. Prva motivacija je ta da će vlasnik uređenijeg (skupljeg) stana će imati više “dobrog materijala” za napisati u opis dok vlasnik manje uređenog (jeftinijeg) stana neće imati toliko “dobrog materijala” za staviti u opis. Druga motivacija nam je da ako se vlasnik oglasa potrudio napisati veliki opis onda će se potruditi više oko prodaje nekretnine tj. pokušat će ga prodati po većoj cijeni od vlasnika oglasa koji je napisao manji oglas.

X3_3_Puni_opis = podaci
options(scipen=0)

# Stvaranje novog stupca gdje ce pisati broj rijeci u oglasu za svaki opis
X3_3_Puni_opis$br_rijeci = NA 
opis=X3_3_Puni_opis$opis
for (x in 1:length(podaci$naslov)) {
  my_string <- opis[x]
  X3_3_Puni_opis$br_rijeci[x] <- length(strsplit(as.character(my_string), "\\w+")[[1]])
}
rm(x,my_string)

# Prikaz korelacije 
p1<-ggplot(X3_3_Puni_opis, aes(y = kvadrat, x = br_rijeci )) + 
  geom_point(shape=18, color="deepskyblue3")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  ylab("Cijena po m2") +
  xlab("Broj riječi u oglasu") +
  ggtitle("Utjecaj broja riječi na cijenu kvadrata stana") +
  coord_cartesian(xlim = c(0,600), ylim = c(0,7500)) +
  theme(axis.text = element_text(size = 10),
        axis.title = element_text(size = 15, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 20, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p1

rm(p1)

# Linearna regresija za analizu
summary(lm(kvadrat~ br_rijeci, X3_3_Puni_opis))
## 
## Call:
## lm(formula = kvadrat ~ br_rijeci, data = X3_3_Puni_opis)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2588.9  -760.5  -204.9   490.5  9623.7 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2.581e+03  1.904e+01  135.55   <2e-16 ***
## br_rijeci   2.061e+00  8.959e-02   23.01   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1146 on 9781 degrees of freedom
## Multiple R-squared:  0.05134,    Adjusted R-squared:  0.05124 
## F-statistic: 529.4 on 1 and 9781 DF,  p-value: < 2.2e-16
rm(filtrirani_podaci)

Nakon provođenja programa dobivamo da korelacija uzorka iznosi 0.2268 te da nam je R2=0.04945. Iz grafa i dobivene korelacije možemo naslutiti da je korelacija značajna i veća od 0, no to ipak moramo testirati kako bi bili sigurniji. Za provjeru koristit ćemo se testom o značajnosti Pearsonog koeficijenta korelacije.

# Test znacajnosti korelacije
cor.test(X3_3_Puni_opis$br_rijeci, X3_3_Puni_opis$kvadrat, alternative = "gr")
## 
##  Pearson's product-moment correlation
## 
## data:  X3_3_Puni_opis$br_rijeci and X3_3_Puni_opis$kvadrat
## t = 23.008, df = 9781, p-value < 2.2e-16
## alternative hypothesis: true correlation is greater than 0
## 95 percent confidence interval:
##  0.2107509 1.0000000
## sample estimates:
##       cor 
## 0.2265877

Iz provedenog testa vidimo da nam je p-vrijednost daleko manja od 0.05 te uz razinu značajnosti od 5% odbacujemo nultu hipotezu da nam je prava korelacija manja ili jednaka 0. Iz testa još vidimo da nam donja granica, 95%-tnog intervala, iznosi 0.2110, a gornja 1 što u prijevodu znači da s 95% sigurnošću možemo reći da nam se prava korelacija nalazi između 0.2110 i 1. Još jedna od bitnih stvari za komentirati je rezultat R2. U našem slučaju R2 iznosi 0.04945 što znači da je manje od 5% odstupanja zavisne varijable protumačeno modelom. Iz toga bi mogli zaključiti da je naš model jako “loš” (što je i očekivano jer bi bilo apsurdno da možemo modelom predvidjeti cijenu iz informacije o broju riječi u oglasu), no ne smijemo zaboraviti da mi uopće nismo pokušavali napraviti model već samo vidjeti postoji li ikakva korelacija između broja rijeci i cijene po m2.

Za kraj, na hipotezu o tome postoji li korelaciji između broja rijeci i cijene po m2, kao i u svakoj hipotezi iz ekonomije, ne možemo dati 100%-tni da, ali možemo reći da vrlo vjerojatno postoji slaba korelacija između te dvije varijable.

Analiza određenih riječi

Nakon analize broja riječi u opisima krećemo s analizom određenih riječi. U ovom dijelu rada promatramo postoji li razlika u cijenama kvadrata stanova između oglasa koji sadrže određene riječi u svojim opisima (npr. more, terasa) te oglasima koji ne sadrži te riječi. Motivaciju ćemo naći u primjeru za riječ more. Stanovi koji su blizu mora će vrlo vjerojatno spomenuti u opisu da se nalazu blizu mora, dok stanovi koji se ne nalaze blizu mora neće uopće spominjati riječ more u svojim opisima i očekujemo da će stanovi blizu mora biti skuplji u odnosu na ostale.

U donjem dijelu koda smo napravili tablicu frekvencije rijeci kako bi nam pomoglo u odluci koje rijeci ćemo promatrati.

#Novi vektor gdje ce se nalaziti sve rijeci iz svih opisa
v = character() 
for (y in 1:length(podaci$naslov)) {
  a=strsplit(str_squish(gsub("[^[:alpha:]]"," ",opis[y]))," ")
  v=c(v,a)
}
rm(y,a)

# Stvaranje Corpusa
text_podaci<-Corpus(VectorSource(v)) 
rm(v)

# Čišćenje Corpusa
text_1<-tm_map(text_podaci, removeNumbers)
text_1<-tm_map(text_podaci, removePunctuation)
rm(text_podaci)

# Stvaranje matrice za analizu
dtm<- TermDocumentMatrix(text_1)
m<-as.matrix(dtm)
k<-sort(rowSums(m), decreasing = TRUE)
word_freq <- data.frame(word = names(k), frequency = k, row.names = NULL)

kable(word_freq[1:25,]) %>% kable_styling(full_width = FALSE,
  position = "center", font_size = 12)
word frequency
stan 22331
email 11150
protected 11061
kod 9768
mail 9305
www 9015
nalazi 8939
sobe 8932
agencije 8795
tel 8127
sastoji 8116
nekretnine 7678
spavaće 7029
zgrade 6372
površine 6346
ima 6232
dnevnog 5861
boravka 5680
katu 5356
dvije 5327
stana 5133
kupaonice 5109
kuhinje 5107
dux 4408
će 4351


Pomoću tablice odlučili smo se da ćemo promatrati 4 rijeci: more, parking, prizemlje i terasa.

Provjera sadrži li oglas određenu riječ ili ne

Donji dio koda prolazi kroz sve opise u svim oglasima te traži spominje li se odabrana riječ u opisu. Zbog padeža u hrvatskom jeziku ne možemo samo staviti da nam traži odabranu riječ u nominativu pa smo pomoću regularnih izraza sastavili kod takav da nam traži sve rijeci koje kreću s korijenom te rijeci te “pokupili” sve padeže te rijeci.

#stavranje stupaca
X3_3_Puni_opis$more = NA
X3_3_Puni_opis$parkirno = NA
X3_3_Puni_opis$prizemlje = NA
X3_3_Puni_opis$terasa = NA

#stvaranje vektora gdje dijelim na oglase s odredenom rijeci i bez te rijeci
da_more = vector()
ne_more = vector()
da_parking = vector()
ne_parking = vector()
da_prizemlje = vector()
ne_prizemlje = vector()
da_terasa = vector()
ne_terasa = vector()

for (i in 1:length(podaci$naslov)) {
  string_opis = opis[i]
  string_opis = tolower(string_opis)
  
  if (grepl("\\bmor[[:alpha:]]\\b",string_opis)) {
    X3_3_Puni_opis$more[i] = 1
    da_more=c(da_more,X3_3_Puni_opis$kvadrat[i])
  } else {
    X3_3_Puni_opis$more[i] = 0
    ne_more=c(ne_more,X3_3_Puni_opis$kvadrat[i])
  }
  
  if (grepl("\\bparkir[[:alpha:]]*\\b",string_opis)) {
    X3_3_Puni_opis$parkirno[i] = 1
    da_parking=c(da_parking,X3_3_Puni_opis$kvadrat[i])
  } else {
    X3_3_Puni_opis$parkirno[i] = 0
    ne_parking=c(ne_parking,X3_3_Puni_opis$kvadrat[i])
  }
  
  if (grepl("\\bprizem[[:alpha:]]*\\b",string_opis)) {
    X3_3_Puni_opis$prizemlje[i] = 1
    da_prizemlje=c(da_prizemlje,X3_3_Puni_opis$kvadrat[i])
  } else {
    X3_3_Puni_opis$prizemlje[i] = 0
    ne_prizemlje=c(ne_prizemlje,X3_3_Puni_opis$kvadrat[i])
  }
  
  if (grepl("\\bteras[[:alpha:]]*\\b",string_opis)) {
    X3_3_Puni_opis$terasa[i] = 1
    da_terasa=c(da_terasa,X3_3_Puni_opis$kvadrat[i])
  } else {
    X3_3_Puni_opis$terasa[i] = 0
    ne_terasa=c(ne_terasa,X3_3_Puni_opis$kvadrat[i])
  }
}
rm(i,string_opis,opis)

Filtriranje data seta

df.1 <- X3_3_Puni_opis  %>%
  mutate(more_1 = case_when(more == "1" ~ "Stan je blizu mora",
                            more == "0" ~ "Stan nije blizu mora")) %>% 
  mutate(prizemlje_1 = case_when(prizemlje == "1" ~ "Stan je u prizemlju",
                                 prizemlje == "0" ~ "Stan nije u prizemlju")) %>% 
  mutate(parkirno_1 = case_when(parkirno == "1" ~ "Stan ima parking",
                                parkirno == "0" ~ "Stan nema parking")) %>% 
  mutate(terasa_1 = case_when(terasa == "1" ~ "Stan ima terasu",
                              terasa == "0" ~ "Stan nema terasu")) 

Nakon filtriranje podataka možemo krenuti na testiranje razlike sredina i stvaranje grafova

Regresijski grafovi kada je u opisu riječ more i kada nije

p4<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="deepskyblue3")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  facet_grid(~more_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  coord_cartesian(xlim = c(0,300), ylim = c(0,1000000)) +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p4

rm(p4)
#test razlike sredina kod rijeci more
t.test(da_more, ne_more)
## 
##  Welch Two Sample t-test
## 
## data:  da_more and ne_more
## t = 30.973, df = 7228.5, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  693.1687 786.8391
## sample estimates:
## mean of x mean of y 
##  3349.537  2609.533

Iz scatter plota i linearne regresije se može naslutiti da bi prosječna cijena kvadrata stanova blizu mora trebala biti veća od stanova koji nisu blizu mora. Ta tvrdnja se testira testom o razlici sredina. Testove za sve rijeci smo obavili na razini značajnosti od 5%. Nakon provođenje testa iz dobivene p-vrijednosti od 2.2*10^-16 možemo odbaciti nultu hipotezu da ne postoji razlika između prosječne cijene kvadrata te iz 95%-tnog intervala signifikantnosti zaključujemo da su stanovi koji su blizu mora skuplji oko 693.11-786.75€ po kvadratu od stanova koji nisu blizu mora.

Regresijski grafovi kada je u opisu riječ parkirno i kada nije

p5<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="darkgreen")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  facet_grid(~parkirno_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  coord_cartesian(xlim = c(0,300), ylim = c(0,1000000)) +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p5

rm(p5)
#test razlike sredina kod rijeci parkirno
t.test(da_parking, ne_parking)
## 
##  Welch Two Sample t-test
## 
## data:  da_parking and ne_parking
## t = 17.18, df = 9753.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  356.7970 448.7056
## sample estimates:
## mean of x mean of y 
##  3136.052  2733.301

Analogno kao i za more iz scatter plota i linearne regresija se vidi da bi stanovi s parkingom trebali imati skuplji prosjecni kvadrat od stanova koji nemaju parking. Iz provedenog testa o razlici sredina zakljucujemo da postoji znacajna razlika izmedu prosjecih kvadrata te iz 95%-tnog intervala signifikantnosti zakljucujemo da u prosjeku kvadrat stana s parkirnom je skuplji za oko 355.98-447.84€ od stana bez parkiga.

Regresijski grafovi kada je u opisu riječ prizemlje i kada nije

p6<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="firebrick")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  facet_grid(~prizemlje_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  coord_cartesian(xlim = c(0,300), ylim = c(0,1000000)) +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p6

rm(p6)
#test razlike sredina kod rijeci prizemlje
t.test(da_prizemlje, ne_prizemlje)
## 
##  Welch Two Sample t-test
## 
## data:  da_prizemlje and ne_prizemlje
## t = 6.4135, df = 6114.3, p-value = 1.528e-10
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  112.7600 212.0367
## sample estimates:
## mean of x mean of y 
##  3040.179  2877.781

U slučaju prizemlja, vizualno je puno teze uočiti razliku u prosječnoj cijeni kvadrata između stanova koji se nalazu u prizemlju i koji se ne nalazu u prizemlju nego kod primjera za more i parking. Iz provedenog testa dobivamo da postoji značajna razlika te iz intervala signifikantnosti zaključujemo da se ta razlika nalazi između 112.05-211.27€.

Regresijski grafovi kada je u opisu riječ terasa i kada nije

p7<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="darkturquoise")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  facet_grid(~terasa_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  coord_cartesian(xlim = c(0,300), ylim = c(0,1000000)) +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p7

rm(p7)
#test razlike sredina kod rijeci parkirno
t.test(da_terasa, ne_terasa)
## 
##  Welch Two Sample t-test
## 
## data:  da_terasa and ne_terasa
## t = 22.935, df = 7499.2, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  510.8538 606.3419
## sample estimates:
## mean of x mean of y 
##  3257.268  2698.670
rm(list = ls.str(mode = 'numeric'))

Za terasu dobivamo ocekivanu vizualnu razliku izmedu grafova te pomocu testa dobivamo da stvarno postoji znacajna razlika u prosjecnim cijenama kvadrata izmedu stanova s terasom i bez terase. Iz intervala signifikantnosti dobivamo da u prosjeku stanovi s terasom su skuplji za oko 510.71-606.14€ po kvadratu od stanova bez terase.

Regresijska analiza

Pomoću donjeg dijela koda dobivamo koeficijente binarne regresije (yi = β0 + β1*xi + β2*Di) gdje yi predstavlja ukupnu cijenu stana, xi veličinu stana (broj kvadrata) te Di je binarna varijabla koja iznosi 1 ako se spominje određena riječ u opisu, a 0 ako se ta riječ ne spominje u opisu.

m3<-lm(cijena~kvadratura + more,df.1)
m4<-lm(cijena~kvadratura + prizemlje,df.1)
m5<-lm(cijena~kvadratura + terasa,df.1)
m6<-lm(cijena~kvadratura + parkirno,df.1)
stargazer(list(m3,m4,m5,m6), type = "text")
## 
## =========================================================================================
##                                                    Dependent variable:                   
##                                 ---------------------------------------------------------
##                                                          cijena                          
##                                      (1)            (2)           (3)           (4)      
## -----------------------------------------------------------------------------------------
## kvadratura                       2,770.899***  2,851.464***  2,716.861***   2,833.327*** 
##                                    (31.753)      (32.854)      (32.708)       (32.579)   
##                                                                                          
## more                            73,465.160***                                            
##                                  (2,593.579)                                             
##                                                                                          
## prizemlje                                      14,172.160***                             
##                                                 (2,861.979)                              
##                                                                                          
## terasa                                                       59,325.000***               
##                                                               (2,688.215)                
##                                                                                          
## parkirno                                                                   37,852.200*** 
##                                                                             (2,637.090)  
##                                                                                          
## Constant                        -19,148.360***   1,224.086   -7,284.433**  -11,150.900***
##                                  (3,106.202)    (3,206.230)   (3,082.608)   (3,278.122)  
##                                                                                          
## -----------------------------------------------------------------------------------------
## Observations                        9,783          9,783         9,783         9,783     
## R2                                  0.478          0.437         0.462         0.447     
## Adjusted R2                         0.478          0.437         0.462         0.447     
## Residual Std. Error (df = 9780)  126,483.100    131,404.500   128,410.700   130,204.800  
## F Statistic (df = 2; 9780)       4,483.714***  3,794.723***  4,204.399***   3,955.502*** 
## =========================================================================================
## Note:                                                         *p<0.1; **p<0.05; ***p<0.01
rm(m3,m4,m5,m6,df.1)

Iz koeficijenata uz Di varijablu možemo zaključiti sljedeće tvrdnje.

U prosjeku:

  1. Stanovi blizu mora su skuplji za 73428.77€ od stanova udaljenih od mora.

  2. Stanovi u prizemlju su skuplji za 14122.73€ od stanova koji nisu u prizemlju.

  3. Stanovi s terasom su skuplji za 59277.38€ od stanova bez terase.

  4. Stanovi s parkingom su skuplji za 37783.22€ od stanova bez parkinga.